scikitlearn lesson_predict_stock¶
In [6]:
# pip install ipython==6.1.0 jupyter==1.0.0 matplotlib==2.0.2
# pip install numpy==1.13.3 pandas==0.20.3 pandas-datareader==0.5.0 scikit-learn==0.19.0
import datetime
import IPython.display
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader
import sklearn
import sklearn.linear_model
import sklearn.model_selection
IPython.display.Image('concept.png', width=500)
Out[6]:
In [7]:
# データウェアハウス
df_aapl = pandas_datareader.data.DataReader('AAPL', 'yahoo', '2014-11-01')
df_fb = pandas_datareader.data.DataReader('FB', 'yahoo', '2014-11-01')
df_gold = pandas_datareader.data.DataReader('GLD', 'yahoo', '2014-11-01')
In [8]:
df_aapl.tail(2)
Out[8]:
In [9]:
IPython.display.Image('concept.png', width=500)
Out[9]:
In [10]:
# 統計学 Simple Moving Average
df_aapl['SMA'] = df_aapl['Close'].rolling(window=14).mean()
df_aapl['Close'].plot(figsize=(15,6), color="red")
df_aapl['SMA'].plot(figsize=(15,6), color="green")
plt.show()
In [11]:
IPython.display.Image('concept.png', width=500)
Out[11]:
In [12]:
# データーマイニング
df_aapl['change'] = (((df_aapl['Close'] - df_aapl['Open'])) / (df_aapl['Open']) * 100)
df_fb['change'] = (((df_fb['Close'] - df_fb['Open'])) / (df_fb['Open']) * 100)
df_gold['change'] = (((df_gold['Close'] - df_gold['Open'])) / (df_gold['Open']) * 100)
df_aapl.tail(2).round(2)
Out[12]:
In [13]:
# データマイニング
df_aapl['Close'].plot(figsize=(15,6), color="red")
df_fb['Close'].plot(figsize=(15,6), color="blue")
plt.show()
In [14]:
# データマイニング
df_aapl['Close'].plot(figsize=(15,6), color="red")
df_gold['Close'].plot(figsize=(15,6), color="orange")
plt.show()
In [15]:
# データマイニング
df_aapl['change'].tail(100).plot(grid=True, figsize=(15,6), color="red")
df_fb['change'].tail(100).plot(grid=True, figsize=(15,6), color="blue")
df_gold['change'].tail(100).plot(grid=True, figsize=(15,6), color="orange")
plt.show()
In [16]:
IPython.display.Image('concept.png', width=500)
Out[16]:
In [17]:
IPython.display.Image('algo.png')
Out[17]:
In [18]:
# 機械学習(マシンラーニング)
df_aapl['label'] = df_aapl['Close'].shift(-30)
df_aapl.tail(40)
Out[18]:
In [19]:
# 機械学習(マシンラーニング)
# ラベル行を削除したデーターをXに代入
X = np.array(df_aapl.drop(['label', 'SMA'], axis=1))
# 取りうる値の大小が著しく異なる特徴量を入れると結果が悪くなり、平均を引いて、標準偏差で割ってスケーリングする
X = sklearn.preprocessing.scale(X)
# 予測に使う過去30日間のデーター
predict_data = X[-30:]
# 過去30日を取り除いた入力データー
X = X[:-30]
y = np.array(df_aapl['label'])
# 過去30日を取り除いた正解ラベル
y = y[:-30]
# 訓練データー80% 検証データー 20%に分ける
# 第一引数に入力データー、第2引数に正解ラベルの配列
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
X, y, test_size = 0.2)
# 訓練データーを用いて学習する
lr = sklearn.linear_model.LinearRegression()
lr.fit(X_train,y_train)
# 検証データーを用いて検証してみる
accuracy = lr.score(X_test, y_test)
accuracy
Out[19]:
In [20]:
# 予測する
predicted_data = lr.predict(predict_data)
predicted_data
Out[20]:
In [21]:
df_aapl['Predict'] = np.nan
last_date = df_aapl.iloc[-1].name
one_day = 86400
next_unix = last_date.timestamp() + one_day
for data in predicted_data:
next_date = datetime.datetime.fromtimestamp(next_unix)
next_unix += one_day
df_aapl.loc[next_date] = np.append([np.nan]* (len(df_aapl.columns)-1), data)
df_aapl['Close'].plot(figsize=(15,6), color="green")
df_aapl['Predict'].plot(figsize=(15,6), color="orange")
plt.show()
In [22]:
IPython.display.Image('concept.png', width=500)
Out[22]:
In [23]:
# ディープラーニング
# https://www.tensorflow.org/tutorials/deep_cnn
In [24]:
IPython.display.Image('concept.png', width=500)
Out[24]:
In [25]:
# 人工知能(AI)
if df_aapl['Predict'][-1] > df_aapl['Close'][-31]:
print('Buy using REST API')
else:
print('Sell using REST API')